package com.shujia.jichu

/**
 * 2、函数作为返回值返回
 */
object Demo12Fun {
  def main(args: Array[String]): Unit = {
    /**
     * fun函数：
     * 参数：是一个参数列表为String类型返回值为Int类型的函数
     * 返回值：是一个参数列表为String类型返回值为Int类型的函数
     *
     *
     */
    def fun(f: String => Int): String => Int = {
      println("好好学习，天天向上")
      f
    }

    //    def m(s:String): Int = {
    //      s.toInt
    //    }
    //    val show1:String=>Int = fun(m)
    //    println(show1("100"))

    /**
     * def fun(f:Int):Int={
     * println("好好学习，天天向上")
     * f
     * }
     */
    //不额外定义函数传参
    val f2: String => Int = fun((s: String) => s.toInt)

    println("="*100)
    def fun1(str: String): String => Int = {
      //因为fun1函数调用完毕后需要返回一个参数类型是String类型，返回值是Int类型的函数
      //所以需要在fun1的内部造一个函数进行返回
      def show(s:String):Int={
        str.toInt+s.toInt
      }
      show
    }
    //调用fun1函数
    val fun2:String => Int = fun1("1000")
    val i: Int = fun2("1000")
    println(i)

    println("="*100)
    //fun1函数的调用可以进行简化
    val i1: Int = fun1("1000")("1000")
    println(i1)
    println("="*100)

    def fun3(str: String,str2:String):Int = {
      str.toInt+str2.toInt
    }

    val i2: Int = fun3("1000", "1000")
    println(i2)
    println("="*100)
    val fun4: String => Int = fun1("1000")
    println(fun4("2000"))
    println(fun4("4000"))
    println(fun4("3000"))
    println(fun4("5000"))
    println(fun4("6000"))

    /**
     *  当函数原本一次性传递多个参数的时候，现在改成分开传递参数的形式，增加了函数的灵活性和可复用性
     *  这样调用的方式有一个数学概念：柯里化
     *  scala的函数柯里化：函数的返回值依旧是一个函数，继续传参
     *
     *  面试题：请你说一说scala中的函数柯里化指的是什么？
     */
    println("="*100)
    def fun5(str: String,str2:String):Int = {
      str.toInt+str2.toInt
    }

    //中间由scala产生的函数，称之为偏函数
    val show2: String => Int = fun5("1000", _)
    println(show2("1"))
    println(show2("2"))
    println(show2("3"))
    println(show2("4"))

  }
}
